/**
 * 创建Set集合类
 * add(element)：向集合添加一个新元素。
 * delete(element)：从集合移除一个元素。
 * has(element)：如果元素在集合中，返回 true，否则返回 false。  clear()：移除集合中的所有元素。
 * size()：返回集合所包含元素的数量。它与数组的 length 属性类似。
 * values()：返回一个包含集合中所有值（元素）的数组。
 * 
 */
class Set {
  constructor() {
    this.items = {}
  }
  add(element) {
    if(!this.has(element)) {
      this.items[element] = element
      return true
    }
    return false
  }
  delete(element) {
    if (this.has(element)) { 
      delete this.items[element];
    return true; 
    } 
    return false;
  }
  has(element) {
    return Object.prototype.hasOwnProperty.call(this.items, element);
  }
  size() {
    let count = 0; 
    for(let key in this.items) {
      if(this.items.hasOwnProperty(key)) {
        count++;
      } 
    }
    return count;
  }
  values() {
    let values = []; 
    for(let key in this.items) {
      if(this.items.hasOwnProperty(key)) {
        values.push(key);
      } 
    } 
    return values;
  }
  clear() {
    this.items = {}
  }
  // 并集
  union(otherSet) {
    const unionSet = new Set()
    this.values().forEach(value => unionSet.add(value))
    otherSet.values().forEach(value => unionSet.add(value))
    return unionSet
  }
  // 交集
  intersection(otherSet) { 
    const intersectionSet = new Set();
    const values = this.values();
    const otherValues = otherSet.values();
    let biggerSet = values;
    let smallerSet = otherValues;
    if (otherValues.length - values.length > 0) {
      biggerSet = otherValues; 
      smallerSet = values; 
    } 
    smallerSet.forEach(value => {
      if (biggerSet.includes(value)) { 
        intersectionSet.add(value); 
      } 
    })
    return intersectionSet
  }
  // 差集
  difference(otherSet) { 
    const differenceSet = new Set()
    this.values().forEach(value => {
      if (!otherSet.has(value)) {
        differenceSet.add(value)
      } 
    })
    return differenceSet 
  }
  // 子集
  isSubsetOf(otherSet) { 
    if (this.size() > otherSet.size()) {
      return false;
    }
    let isSubset = true;
    this.values().every(value => {
      if (!otherSet.has(value)) {
        isSubset = false;
        return false;
      }
      return true; 
    });
    return isSubset;
  }

}

const set = new Set()

set.add(1)
console.log(set.values())
console.log(set.has(1));
console.log(set.size());
